#!/usr/bin/env python
"""
合并split.py创建的目录下的所有分割文件以重建文件。
大概相当于Unix下的cat fromdir/* > tofile命令，
不过可移植性和可配置性更好，
并且将合并操作作为可以重复使用的函数。
依赖文件名的排序顺序：长度必须一致。
可以进一步拓展为分割/合并，弹出Tkinter文件选择器。
"""

import os
import sys


def join(fromdir, tofile, readsize=1024):
    output = open(tofile, 'wb')
    parts = os.listdir(fromdir)
    parts.sort()

    for part in parts:
        path = os.path.join(fromdir, part)
        infile = open(path, 'rb')

        while True:
            read = infile.read(readsize)
            if not read:
                break
            output.write(read)

        infile.close()

    output.close()


def command():

    if len(sys.argv) == 2 and sys.argv[1] == '--help':
        print('Use: ./join.py [from-dir-name to-file-name [read-size]]')
    else:

        if len(sys.argv) < 3:
            interactive = True
            fromdir = input('请输入分割文件所在的目录：')

            if 'splited_' in os.path.basename(fromdir):
                tofile = os.path.basename(fromdir).replace('splited_', '')
                tofile = input('请输入合并后的文件名（回车后默认{}）：'.format(tofile)) or tofile
            else:
                tofile = input(
                    '请输入合并后的文件名（回车后默认{}）：'.format(os.path.basename(fromdir))
                ) or os.path.basename(fromdir)

            readsize = input('请输入每次读取的字节大小（回车后默认1024）：') or 1024
            readsize = int(readsize)

        else:
            interactive = False
            fromdir, tofile = sys.argv[1], sys.argv[2]
            readsize = 1024

            if len(sys.argv) > 3:
                readsize = int(sys.argv[3])

        absfrom, absto = map(os.path.abspath, [fromdir, tofile])
        print('将{}下的分割文件合并为{}，每次读取{}字节'.format(absfrom, absto, readsize))

        try:
            join(fromdir, tofile, readsize=readsize)
        except Exception:
            print('合并失败')
            print(sys.exc_info()[0], sys.exc_info()[1])
        else:
            print('合并成功：{}'.format(absto))

        if interactive:
            input('按回车键退出……')


if __name__ == '__main__':
    command()
